﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using HelperTool_WHW;

//using FastReport;
using Seagull.BarTender.Print;

namespace MainFrame
{
    public class printOperate
    {
        //private Report report = new Report();//fastreport打印Report
        public Engine m_engine = null;//bartender打印引擎，必须要安装bartender才能使用
        public LabelFormatDocument format = null;//bartender打印格式
        public AutoResetEvent print_are = new AutoResetEvent(true);//打印同步控制
        private string m_print_template_path;
        private string m_printer_name;
        //public string Print_template_path { get => m_print_template_path; set => m_print_template_path = value; }

        public Engine engine
        {

            get
            {
                try
                {
                    if (m_engine == null)
                    {
                        m_engine = new Engine(true);
                    }
                }
                catch (PrintEngineException ex)
                {
                    LogNetHelper.WriteLog(ex);
                    UserControlHelper.globalVar.InfoTips($"bartender加载异常：需要安装bartender软件" + Environment.NewLine +
                        $"{ex}", $"{ex}");
                    System.Windows.Forms.MessageBox.Show($"bartender加载异常：需要安装bartender软件"
                        + Environment.NewLine + $"{ex}");
                }

                return m_engine;
            }
            set
            {
                try
                {
                    if (value == null)
                    {
                        value = new Engine(true);
                    }
                    m_engine = value;
                }
                catch (PrintEngineException ex)
                {
                    LogNetHelper.WriteLog(ex);
                    UserControlHelper.globalVar.InfoTips($"bartender加载异常：需要安装bartender软件" + Environment.NewLine +
                        $"{ex}", $"{ex}");
                    System.Windows.Forms.MessageBox.Show($"bartender加载异常：需要安装bartender软件"
                        + Environment.NewLine + $"{ex}");
                }

            }
        }



        public void stopEngine()
        {
            try
            {
                if (m_engine!=null)
                {
                    m_engine.Dispose();
                }
                if (format!=null)
                {
                    format.Close(SaveOptions.DoNotSaveChanges);
                }
            }
            catch (Exception ex)
            {
                LogNetHelper.WriteLog(ex);
            }
        }
        public void initFormat(string path,string printerName)
        {
            try
            {
                m_printer_name = printerName;
                m_print_template_path = path;
                format = engine.Documents.Open(path);
                format.Activate();
            }
            catch (Exception ex)
            {
                LogNetHelper.WriteLog(ex);
            }
        }
        public bool printTemplateEdit(string path)
        {
            try
            {
                if (string.IsNullOrEmpty(path))
                {
                    UserControlHelper.globalVar.InfoTips($"请先选择模板再编辑", "");
                    return false;
                }
                //if (System.IO.Path.GetExtension(path).ToLower() == ".frx")
                //{
                //    Report report = new Report();
                //    report.Load(path);
                //    report.Design();
                //    report.Dispose();
                //}
                if (System.IO.Path.GetExtension(path).ToLower() == ".btw" || System.IO.Path.GetExtension(path).ToLower() == ".prn")
                {
                    System.Diagnostics.Process.Start(path);
                }

                return true;
            }
            catch (System.Exception ex)
            {
                LogNetHelper.WriteLog("printTemplateEdit", ex);
                return false;
            }
        }

        /// <summary>
        /// 模板打印
        /// </summary>
        /// <param name="path">模板路径</param>
        /// <param name="para">模板变量对应的参数字典（需要有设置变量名的软件界面或者配方文件）</param>
        /// <param name="printerName">打印机名称，如果不设置，用默认打印机</param>
        /// <param name="printNumber">打印数量，如果不设置，默认是1</param>
        /// <returns></returns>
        public bool labelPrint(string path, Dictionary<string, string> para,
            string printerName = "", int printNumber = 1)
        {
            try
            {
                print_are.WaitOne();
                #region noted
                //if (System.IO.Path.GetExtension(path).ToLower() == ".frx")
                //{
                //    //Report report = new Report();
                //    try
                //    {
                //        report.Load(path);
                //        if (para != null && para.Count > 0)
                //        {
                //            foreach (var item in para)
                //            {
                //                if ((!string.IsNullOrEmpty(item.Key.ToString())) && (!string.IsNullOrEmpty(item.Value.ToString())))
                //                {
                //                    report.SetParameterValue(item.Key.ToString(), item.Value.ToString());
                //                }
                //            }
                //        }
                //        report.PrintSettings.ShowDialog = false;
                //        report.PrintSettings.Copies = printNumber;//打印数量
                //        if (!string.IsNullOrEmpty(printerName))
                //        {
                //            report.PrintSettings.Printer = printerName;
                //        }
                //        report.Print();
                //    }
                //    catch (Exception ex)
                //    {
                //        LogNetHelper.WriteLog(ex);
                //    }
                //    //finally
                //    //{
                //    //    report.Dispose();
                //    //}
                //}
                #endregion
                //引用库（以下为bartender引用库的调用方式）
                if (System.IO.Path.GetExtension(path).ToLower() == ".btw")
                {
                    //format = engine.Documents.Open(path);

                    if (!string.IsNullOrEmpty(printerName))
                    {
                        format.PrintSetup.PrinterName = printerName;
                    }
                    //format.PrintSetup.StartingPosition = 1;//起始位置
                    format.PrintSetup.IdenticalCopiesOfLabel = printNumber;//打印数量
                    //format.PrintSetup.NumberOfSerializedLabels = 1;//递增
                    if (para != null && para.Count > 0)
                    {
                        foreach (var item in para)
                        {
                            if ((!string.IsNullOrEmpty(item.Key.ToString())) && (!string.IsNullOrEmpty(item.Value.ToString())))
                            {
                                format.SubStrings[item.Key.ToString()].Value = item.Value.ToString();
                            }
                        }
                    }

                    //format.Print();//是否显示打印窗口和打印对话框
                    //format.Close(SaveOptions.SaveChanges);

                }

                #region 安装bartender的调用方式 
                //安装bartender或者引用库（以下为安装bartender的调用方式）
                //if (System.IO.Path.GetExtension(path).ToLower() == ".btw")
                //{
                //    BarTender.Application btapp = new BarTender.Application();
                //    BarTender.Format btf = new BarTender.Format();
                //    btf = btapp.Formats.Open(path, false, "");

                //    btf.PrintSetup.StartingPosition = 1;//起始位置
                //    btf.PrintSetup.IdenticalCopiesOfLabel = 1;//同一个标签
                //    btf.PrintSetup.NumberSerializedLabels = 1;//序列化的标签数量
                //    if (para!=null&&para.Count>0)
                //    {
                //        foreach (var item in para)
                //        {
                //            if ((!string.IsNullOrEmpty(item.Key.ToString())) && (!string.IsNullOrEmpty(item.Value.ToString())))
                //            {
                //                btf.SetNamedSubStringValue(item.Key.ToString(), item.Value.ToString());
                //            }
                //        }
                //    }

                //    btf.PrintOut(false, false);//是否显示打印窗口和打印对话框
                //    btf.Close(BarTender.BtSaveOptions.btSaveChanges);

                //}
                #endregion
                print_are.Set();
                return true;
            }
            catch (Exception ex)
            {
                LogNetHelper.WriteLog(ex);
                print_are.Set();
                return false;
            }
        }


        /// <summary>
        /// 模板打印
        /// </summary>
        /// <param name="path">模板路径</param>
        /// <param name="para">模板变量对应的参数列表（模板中，变量为par0、par1、par2、par3等）</param>
        /// <param name="printerName">打印机名称，如果不设置，用默认打印机</param>
        /// <param name="printNumber">打印数量，如果不设置，默认是1</param>
        /// <returns></returns>
        public bool labelPrint(string path, List<string> para,
            string printerName = "", int printNumber = 1)
        {
            try
            {
                #region fastreport
                //if (System.IO.Path.GetExtension(path).ToLower() == ".frx")
                //{
                //    //Report report = new Report();
                //    try
                //    {
                //        report.Load(path);
                //        if (para != null && para.Count > 0)
                //        {
                //            for (int i = 0; i < para.Count; i++)
                //            {
                //                report.SetParameterValue("par" + i.ToString(), para[i]);
                //            }
                //        }
                //        report.PrintSettings.ShowDialog = false;
                //        report.PrintSettings.Copies = printNumber;//打印数量
                //        if (!string.IsNullOrEmpty(printerName))
                //        {
                //            report.PrintSettings.Printer = printerName;
                //        }
                //        report.Print();
                //    }
                //    catch (Exception ex)
                //    {
                //        LogNetHelper.WriteLog(ex);
                //    }
                //    //finally
                //    //{
                //    //    report.Dispose();
                //    //}
                //}
                #endregion
                //引用库（以下为bartender引用库的调用方式）
                if (System.IO.Path.GetExtension(path).ToLower() == ".btw")
                {
                    //format = engine.Documents.Open(path);

                    if (!string.IsNullOrEmpty(printerName))
                    {
                        format.PrintSetup.PrinterName = printerName;
                    }
                    //format.PrintSetup.StartingPosition = 1;//起始位置
                    format.PrintSetup.IdenticalCopiesOfLabel = printNumber;//打印数量
                    //format.PrintSetup.NumberOfSerializedLabels = 1;//递增
                    if (para != null && para.Count > 0)
                    {
                        try
                        {
                            for (int i = 0; i < para.Count; i++)
                            {
                                format.SubStrings["par" + i.ToString()].Value = para[i];
                            }
                        }
                        catch (Exception ex)
                        {
                            LogNetHelper.WriteLog(ex);
                        }
                      
                    }

                    format.Print();//是否显示打印窗口和打印对话框
                    //format.Close(SaveOptions.SaveChanges);

                }

                #region 安装bartender的调用方式 
                //安装bartender或者引用库（以下为安装bartender的调用方式）
                //if (System.IO.Path.GetExtension(path).ToLower() == ".btw")
                //{
                //    BarTender.Application btapp = new BarTender.Application();
                //    BarTender.Format btf = new BarTender.Format();
                //    btf = btapp.Formats.Open(path, false, "");

                //    btf.PrintSetup.StartingPosition = 1;//起始位置
                //    btf.PrintSetup.IdenticalCopiesOfLabel = 1;//同一个标签
                //    btf.PrintSetup.NumberSerializedLabels = 1;//序列化的标签数量
                //    if (para!=null&&para.Count>0)
                //    {
                //        foreach (var item in para)
                //        {
                //            if ((!string.IsNullOrEmpty(item.Key.ToString())) && (!string.IsNullOrEmpty(item.Value.ToString())))
                //            {
                //                btf.SetNamedSubStringValue(item.Key.ToString(), item.Value.ToString());
                //            }
                //        }
                //    }

                //    btf.PrintOut(false, false);//是否显示打印窗口和打印对话框
                //    btf.Close(BarTender.BtSaveOptions.btSaveChanges);

                //}
                #endregion
                return true;
            }
            catch 
            {
                return false;
            }
        }

        /// <summary>
        /// 模板打印
        /// </summary>
        /// <param name="para">模板变量对应的参数列表（模板中，变量为par0、par1、par2、par3等）</param>
        /// <param name="printerName">打印机名称，如果不设置，用默认打印机</param>
        /// <param name="printNumber">打印数量，如果不设置，默认是1</param>
        /// <returns></returns>
        public bool labelPrint(List<string> para,
            string printerName = "", int printNumber = 1)
        {
            try
            {
                #region fastreport
                //if (System.IO.Path.GetExtension(path).ToLower() == ".frx")
                //{
                //    //Report report = new Report();
                //    try
                //    {
                //        report.Load(path);
                //        if (para != null && para.Count > 0)
                //        {
                //            for (int i = 0; i < para.Count; i++)
                //            {
                //                report.SetParameterValue("par" + i.ToString(), para[i]);
                //            }
                //        }
                //        report.PrintSettings.ShowDialog = false;
                //        report.PrintSettings.Copies = printNumber;//打印数量
                //        if (!string.IsNullOrEmpty(printerName))
                //        {
                //            report.PrintSettings.Printer = printerName;
                //        }
                //        report.Print();
                //    }
                //    catch (Exception ex)
                //    {
                //        LogNetHelper.WriteLog(ex);
                //    }
                //    //finally
                //    //{
                //    //    report.Dispose();
                //    //}
                //}
                #endregion
                //引用库（以下为bartender引用库的调用方式）
                if (System.IO.Path.GetExtension(m_print_template_path).ToLower() == ".btw")
                {
                    //format = engine.Documents.Open(path);

                    if (!string.IsNullOrEmpty(printerName))
                    {
                        format.PrintSetup.PrinterName = printerName;
                    }
                    //format.PrintSetup.StartingPosition = 1;//起始位置
                    format.PrintSetup.IdenticalCopiesOfLabel = printNumber;//打印数量
                    //format.PrintSetup.NumberOfSerializedLabels = 1;//递增
                    if (para != null && para.Count > 0)
                    {
                        try
                        {
                            for (int i = 0; i < para.Count; i++)
                            {
                                format.SubStrings["par" + i.ToString()].Value = para[i];
                            }
                        }
                        catch (Exception ex)
                        {
                            LogNetHelper.WriteLog(ex);
                        }

                    }

                    format.Print();//是否显示打印窗口和打印对话框
                    //format.Close(SaveOptions.SaveChanges);

                }

                #region 安装bartender的调用方式 
                //安装bartender或者引用库（以下为安装bartender的调用方式）
                //if (System.IO.Path.GetExtension(path).ToLower() == ".btw")
                //{
                //    BarTender.Application btapp = new BarTender.Application();
                //    BarTender.Format btf = new BarTender.Format();
                //    btf = btapp.Formats.Open(path, false, "");

                //    btf.PrintSetup.StartingPosition = 1;//起始位置
                //    btf.PrintSetup.IdenticalCopiesOfLabel = 1;//同一个标签
                //    btf.PrintSetup.NumberSerializedLabels = 1;//序列化的标签数量
                //    if (para!=null&&para.Count>0)
                //    {
                //        foreach (var item in para)
                //        {
                //            if ((!string.IsNullOrEmpty(item.Key.ToString())) && (!string.IsNullOrEmpty(item.Value.ToString())))
                //            {
                //                btf.SetNamedSubStringValue(item.Key.ToString(), item.Value.ToString());
                //            }
                //        }
                //    }

                //    btf.PrintOut(false, false);//是否显示打印窗口和打印对话框
                //    btf.Close(BarTender.BtSaveOptions.btSaveChanges);

                //}
                #endregion
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        /// <summary>
        /// 模板打印
        /// </summary>
        /// <param name="para">模板变量对应的参数列表（模板中，变量为par0、par1、par2、par3等）</param>
        /// <param name="printerName">打印机名称，如果不设置，用默认打印机</param>
        /// <param name="printNumber">打印数量，如果不设置，默认是1</param>
        /// <returns></returns>
        public bool labelPrint(List<string> para, int printNumber = 1)
        {
            try
            {
                #region fastreport
                //if (System.IO.Path.GetExtension(path).ToLower() == ".frx")
                //{
                //    //Report report = new Report();
                //    try
                //    {
                //        report.Load(path);
                //        if (para != null && para.Count > 0)
                //        {
                //            for (int i = 0; i < para.Count; i++)
                //            {
                //                report.SetParameterValue("par" + i.ToString(), para[i]);
                //            }
                //        }
                //        report.PrintSettings.ShowDialog = false;
                //        report.PrintSettings.Copies = printNumber;//打印数量
                //        if (!string.IsNullOrEmpty(printerName))
                //        {
                //            report.PrintSettings.Printer = printerName;
                //        }
                //        report.Print();
                //    }
                //    catch (Exception ex)
                //    {
                //        LogNetHelper.WriteLog(ex);
                //    }
                //    //finally
                //    //{
                //    //    report.Dispose();
                //    //}
                //}
                #endregion
                //引用库（以下为bartender引用库的调用方式）
                if (System.IO.Path.GetExtension(m_print_template_path).ToLower() == ".btw")
                {
                    //format = engine.Documents.Open(path);

                    if (!string.IsNullOrEmpty(m_printer_name))
                    {
                        format.PrintSetup.PrinterName = m_printer_name;
                    }
                    //format.PrintSetup.StartingPosition = 1;//起始位置
                    format.PrintSetup.IdenticalCopiesOfLabel = printNumber;//打印数量
                    //format.PrintSetup.NumberOfSerializedLabels = 1;//递增
                    if (para != null && para.Count > 0)
                    {
                        try
                        {
                            for (int i = 0; i < para.Count; i++)
                            {
                                format.SubStrings["par" + i.ToString()].Value = para[i];
                            }
                        }
                        catch (Exception ex)
                        {
                            LogNetHelper.WriteLog(ex);
                        }

                    }

                    format.Print();//是否显示打印窗口和打印对话框
                    //format.Close(SaveOptions.SaveChanges);

                }

                #region 安装bartender的调用方式 
                //安装bartender或者引用库（以下为安装bartender的调用方式）
                //if (System.IO.Path.GetExtension(path).ToLower() == ".btw")
                //{
                //    BarTender.Application btapp = new BarTender.Application();
                //    BarTender.Format btf = new BarTender.Format();
                //    btf = btapp.Formats.Open(path, false, "");

                //    btf.PrintSetup.StartingPosition = 1;//起始位置
                //    btf.PrintSetup.IdenticalCopiesOfLabel = 1;//同一个标签
                //    btf.PrintSetup.NumberSerializedLabels = 1;//序列化的标签数量
                //    if (para!=null&&para.Count>0)
                //    {
                //        foreach (var item in para)
                //        {
                //            if ((!string.IsNullOrEmpty(item.Key.ToString())) && (!string.IsNullOrEmpty(item.Value.ToString())))
                //            {
                //                btf.SetNamedSubStringValue(item.Key.ToString(), item.Value.ToString());
                //            }
                //        }
                //    }

                //    btf.PrintOut(false, false);//是否显示打印窗口和打印对话框
                //    btf.Close(BarTender.BtSaveOptions.btSaveChanges);

                //}
                #endregion
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
        /// <summary>
        /// 模板打印(无变化参数)
        /// </summary>
        /// <param name="path">模板路径</param>
        /// <param name="printerName">打印机名称，如果不设置，用默认打印机</param>
        /// <param name="printNumber">打印数量，如果不设置，默认是1</param>
        /// <returns></returns>
        public bool labelPrint(string path, string printerName = "", int printNumber = 1)
        {
            try
            {
                print_are.WaitOne();
                //if (System.IO.Path.GetExtension(path).ToLower() == ".frx")
                //{
                //    //Report report = new Report();
                //    try
                //    {
                //        report.Load(path);
                //        report.PrintSettings.ShowDialog = false;
                //        report.PrintSettings.Copies = printNumber;//打印数量
                //        if (!string.IsNullOrEmpty(printerName))
                //        {
                //            report.PrintSettings.Printer = printerName;
                //        }
                //        report.Print();
                //    }
                //    catch (Exception ex)
                //    {
                //        LogNetHelper.WriteLog(ex);
                //    }
                //    //finally
                //    //{
                //    //    report.Dispose();
                //    //}
                //}

                //引用库（以下为bartender引用库的调用方式）
                if (System.IO.Path.GetExtension(path).ToLower() == ".btw")
                {
                    //format = engine.Documents.Open(path);

                    if (!string.IsNullOrEmpty(printerName))
                    {
                        format.PrintSetup.PrinterName = printerName;
                    }
                    //format.PrintSetup.StartingPosition = 1;//起始位置
                    format.PrintSetup.IdenticalCopiesOfLabel = printNumber;//打印数量
                    //format.PrintSetup.NumberOfSerializedLabels = 1;//递增
                    format.Print();//是否显示打印窗口和打印对话框
                    //format.Close(SaveOptions.SaveChanges);

                }

                #region 安装bartender的调用方式 
                //安装bartender或者引用库（以下为安装bartender的调用方式）
                //if (System.IO.Path.GetExtension(path).ToLower() == ".btw")
                //{
                //    BarTender.Application btapp = new BarTender.Application();
                //    BarTender.Format btf = new BarTender.Format();
                //    btf = btapp.Formats.Open(path, false, "");

                //    btf.PrintSetup.StartingPosition = 1;//起始位置
                //    btf.PrintSetup.IdenticalCopiesOfLabel = 1;//同一个标签
                //    btf.PrintSetup.NumberSerializedLabels = 1;//序列化的标签数量
                //    if (para!=null&&para.Count>0)
                //    {
                //        foreach (var item in para)
                //        {
                //            if ((!string.IsNullOrEmpty(item.Key.ToString())) && (!string.IsNullOrEmpty(item.Value.ToString())))
                //            {
                //                btf.SetNamedSubStringValue(item.Key.ToString(), item.Value.ToString());
                //            }
                //        }
                //    }

                //    btf.PrintOut(false, false);//是否显示打印窗口和打印对话框
                //    btf.Close(BarTender.BtSaveOptions.btSaveChanges);

                //}
                #endregion

                print_are.Set();
                return true;
            }
            catch (Exception ex)
            {
                print_are.Set();
                return false;
            }
        }
    }
}
